package com.yt.order.service;

import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.yt.order.models.vo.AreasVO;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.beans.BeanUtils;
import javax.annotation.Resource;
import com.yt.order.common.config.YmlConfig;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import com.yt.order.mapper.AreasMapper;
import com.yt.order.models.service.IAreasService;
import com.yt.order.models.bo.AreasSaveBO;
import com.yt.order.models.dto.AreasDTO;

import java.util.List;
import java.util.stream.Collectors;

/**
 * 地理选区控制器
 *
 * @author zhou
 * @Date 2025-09-23 16:56:46
 */
@DubboService
public class AreasServiceImpl extends ServiceImpl<AreasMapper, AreasDTO> implements IAreasService{

    @Resource
    private YmlConfig ymlConfig;

    @Override
    public boolean add(AreasSaveBO saveBO) {
        AreasDTO dto = new AreasDTO();
        BeanUtils.copyProperties(saveBO,dto);
        Long id = ymlConfig.getPkId();
        dto.setId(id);
        return this.insert(dto);
    }
    /**
     * 获取完整的地区树形结构（从根节点开始递归构建）
     */
    @Override
    public List<AreasVO> getAreaTree() {
        // 根节点为 parentId=0（如“中国”或顶级区域）
        return getChildrenByParentId(Long.valueOf(0));
    }

    /**
     * 递归查询子节点，构建树形结构
     * @param parentId 父节点ID
     * @return 子节点列表（含嵌套子节点）
     */
    @Override
    public List<AreasVO> getChildrenByParentId(Long parentId) {
        // 查询当前父节点下的所有直接子节点
        List<AreasDTO> childDtos = baseMapper.selectList(
                new EntityWrapper<AreasDTO>().eq("parentid", parentId)
        );

        // 转换为VO并递归设置子节点（若当前节点级别 < 3，继续递归，如省->市->区三级结构）
        return childDtos.stream().map(dto -> {
            AreasVO treeVO = new AreasVO();
            BeanUtils.copyProperties(dto, treeVO);
            // 仅对非最末级节点递归查询子节点（如区县级为最末级，无需继续）
            if (dto.getLeveltype() < 3) {
                treeVO.setChildren(getChildrenByParentId(dto.getId()));
            }
            return treeVO;
        }).collect(Collectors.toList());
    }
}
